Delegation是一種設計模式,他讓class某部分的責任能夠交給或委任給另一個實例化的class
Delegate在ios開發裡面是相當普遍的,delegate是在發生事件時會去通知對象的模式,發生事件的取決於上下文。像是當使用者點擊row的時候TableView的delegate會得到通知。或者當使用者在View Controller之間移動,navigation的controller的delegate會收到通知
當同意去委任某物件時,通常都須遵守某些協議。像是TableViewDelegate。 這些protocol通常會有些你可以應用的method。像是當使用者deselect a row時Table View會被通知。這些protocol通常也有些必須實現的method。
現實生活中的委任
想像我們是個為了活動提供餅乾的團隊,你負責烤餅乾,而委任我去製作麵團。一旦我完成麵團就會給你,接著你就可以使用麵團去烤餅乾
這邊有幾個重點
這邊也有點像程式開發。一個class將任務委任給另一個物件,同時也將職責轉交給物件。
Simple Example
定義一個Cookie的struct
struct Cookie {
var size:Int = 5
var hasChocolateChips:Bool = false
}
再來定義一個class叫做Bakery
class Bakery
{
func makeCookie()
{
var cookie = Cookie()
cookie.size = 6
cookie.hasChocolateChips = true
}
}
Bakery的class有一個function叫做makeCookie()製造Cookie的struct物件然後設定一些屬性
我們有三種想要販售餅乾的方式
提供餅乾是烘焙坊的責任,而銷售餅乾不是。所以我們要將提供餅乾的程式碼放進Bakery的class,這時候就需要用到Delegation。
首先將我們要轉移的責任定義一個protocol
protocol BakeryDelegate {
func cookieWasBaked(_ cookie: Cookie)
}
BakeryDelegate的protocol定義了一個cookieWasBaked的function。
這個delgate的function在餅乾被烘烤時被呼叫,接著我們要加上delegation到Bakery的class
class Bakery
{
var delegate:BakeryDelegate?
func makeCookie()
{
var cookie = Cookie()
cookie.size = 6
cookie.hasChocolateChips = true
delegate?.cookieWasBaked(cookie)
}
}
在Bakery的class有兩件式被改變。設一個delegate的變數型態是BakeryDelegate。makeCookie()function裡呼叫cookieWasBaked
現在定義了BakeryDelegate這個protocol,也委任了Bakery的delegate,然後再makeCookie中實現了交接。
再來再建立一個delegate的class
class CookieShop: BakeryDelegate
{
func cookieWasBaked(_ cookie: Cookie)
{
print("Yay! A new cookie was baked, with size \(cookie.size)")
}
}
CookieShop採用了BakeryDelegate的protocol,也實現了cookieWasBaked的function
最後再新增以下的code
let shop = CookieShop()
let bakery = Bakery()
bakery.delegate = shop
bakery.makeCookie()
// Output: Yay! A new cookie was baked, with size 6
以上做了幾件事情
這就是delegation。bakery delegate賣餅乾給shop,每一次製作完成都就交付餅乾
delegation就是bakery不用知道cookies最後會到哪裡,每個遵從BakeryDelegate的protocol都會提供給他們。
bakery不需要知道誰實行protocol,只需要知道在它需要的時候呼叫cookieWasBaked()。